import axios from 'axios';
import type { InternalAxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
import { useUserStore } from '@/stores/user';
// 定义通用的响应数据结构
interface ApiResponse<T = any> {
	code: number
	msg: string
	data: T
  }
// 创建 axios 实例
const service = axios.create({
	baseURL: import.meta.env.VITE_APP_BASE_API,
	timeout: 50000,
	headers: { 'Content-Type': 'application/json;charset=utf-8' }
});



// 请求拦截器
service.interceptors.request.use(
	(config: InternalAxiosRequestConfig) => {
		const userStore = useUserStore();
		if (userStore.token) {
			config.headers["token"] = userStore.token;
		}	
	  return config
	},
	(error: AxiosError) => {
	  // 对请求错误做些什么
	  return Promise.reject(error as AxiosError)
	}
  )

// 响应拦截器
service.interceptors.response.use(
	(response: AxiosResponse<ApiResponse>) => {
	  const { code, msg, data } = response.data
	  // 根据业务状态码处理
	  if (code === 200) {
		return data // 直接返回有用的数据部分
	  }
	  // 处理其他业务状态码
	  return handleBusinessError(code, msg)
	},
	(error: AxiosError) => {
	  // 处理 HTTP 错误状态码
	  return handleHttpError(error)
	}
  )

/**
 * 处理 HTTP 错误
 */
function handleHttpError(error: AxiosError): Promise<never> {
	let errorMessage = '网络错误'
	if (error.response) {
	  // 请求成功发出且服务器也响应了状态码，但状态码超出了 2xx 的范围
	  switch (error.response.status) {
		case 400:
		  errorMessage = '请求错误'
		  break
		default:
		  errorMessage = `未知错误: ${error.response.status}`
	  }
	} else if (error.request) {
	  // 请求已经成功发起，但没有收到响应
	  errorMessage = '无响应，请检查网络连接'
	} else {
	  // 发送请求时出了点问题
	  errorMessage = error.message || '未知请求错误'
	}
	showError(errorMessage)
	return Promise.reject(error)
  }
/**
 * 处理业务错误
 */
function handleBusinessError(code: number, message: string): Promise<never> {
	// 可以根据不同的业务状态码进行特殊处理
	switch (code) {
	  case 401:
		// 跳转到登录页
		// router.push('/login')
		break
	  case 403:
		// 提示权限不足
		break
	  case 500:
		// 服务器错误
		break
	  // 其他业务状态码...
	}
	if(message == '无效token' || message == '用户信息异常' || message == '参数信息丢失' ){
		message = '登录信息失效，请重新登录'
		localStorage.clear();
		location.reload();
	}
	// 统一错误提示
	showError(message || `业务错误: ${code}`)
	return Promise.reject(new Error(message || `Error: ${code}`))
  }


  /**
 * 显示错误提示
 */
function showError(message: string): void {
	// 例如使用 Element Plus:
	ElMessage.error({
	  message: message,
	  showClose: false,
	  duration:1500
	});
  }

// 响应拦截器
service.interceptors.response.use(
	(response: AxiosResponse) => {
		console.log(response)
		const { code, message } = response.data;
		if (code === 200) {
			return response.data;
		}
		return Promise.reject(new Error(message || 'Error'));
	},
	(error: AxiosError ) => {
		return Promise.reject(error.message);
	}
);

// 导出 axios 实例
export default service;
